Иерархия исключений в Ruby
Иерархия исключений в Ruby
Корневой класс:
Exception
Основные подклассы Exception:
-
SystemExit— вызывается при завершении программы (exit,Kernel#exit). -
SignalException— получение сигнала ОС (например,SIGINTпри нажатии Ctrl+C).Interrupt— частный случайSignalExceptionдляSIGINT.
-
ScriptError— ошибки синтаксиса и загрузки:LoadErrorNotImplementedErrorSyntaxError
-
StandardError— основной родитель для большинства исключений, возникающих в пользовательском коде.ArgumentErrorUncaughtThrowError
EncodingErrorCompatibilityError
FiberErrorIOErrorEOFError
IndexErrorKeyErrorStopIteration
LocalJumpErrorNameErrorNoMethodError
RangeErrorFloatDomainError
RegexpErrorRuntimeErrorSecurityErrorSystemCallError— базовый класс для системных ошибок (аналогErrno::*).- Подклассы создаются динамически:
Errno::ENOENT,Errno::EACCES,Errno::EEXISTи т.д.
- Подклассы создаются динамически:
ThreadErrorTypeErrorZeroDivisionError
-
fatal— внутренний псевдокласс (на самом деле не используется напрямую); некоторые фатальные ошибки VM могут быть представлены какfatal, но они не перехватываются обычнымrescue.
Особенности:
-
rescueбез аргументов перехватывает толькоStandardErrorи его подклассы.
Пример:begin# ...rescue => e# то же, что rescue StandardError => eend -
Чтобы перехватить все исключения (включая
SystemExit,SignalException), нужно явно указатьException:begin# ...rescue Exception => e# крайне не рекомендуется в productionend -
Системные ошибки (
Errno::*) генерируются автоматически при ошибках системных вызовов (например, открытие несуществующего файла →Errno::ENOENT). -
NoMethodError— одна из самых частых ошибок: вызов несуществующего метода. -
KeyError— выбрасывается при использованииHash#fetchс отсутствующим ключом без значения по умолчанию. -
StopIteration— используется для завершения итераторов (внутренне вEnumerator).
Как получить список программно:
Ruby позволяет инспектировать иерархию классов:
# Все подклассы Exception
def subclasses_of(klass)
klass.subclasses + klass.subclasses.flat_map { |k| subclasses_of(k) }
end
puts subclasses_of(Exception).map(&:name).sort
Примечание: метод
subclassesдоступен только в режиме отладки или при подключении соответствующих утилит; в общем случае можно использоватьObjectSpace.each_object(Class).
Рекомендации:
- Для пользовательских исключений создавайте подклассы
StandardError:class MyCustomError < StandardError; end - Не перехватывайте
Exceptionбез веской причины — это может помешать корректному завершению программы (например, игнорированиюCtrl+C).
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Блок — это выражение поведения, передаваемое как часть вызова метода, без необходимости именования, инкапсуляции в отдельный класс или даже явного объявления переменной. Его синтаксис ( … или do … Фундамент для начинающего программиста - что повторить, как работать, чего ожидать. Набор советов, правил, принципов и обычаев в разработке на этом языке. Язык поддерживает одиночное наследование, где класс может наследовать от одного родительского класса. Для указания наследования используется оператор <. Ruby — язык программирования, чья история характеризуется осознанной попыткой синтеза эстетики, выразительности и практичности. Его появление в середине 1990-х годов стало ответом на определённый… Кавычки, точки, запятые, скобки и прочие знаки препинания. Ключевые слова BEGIN и END пишутся заглавными буквами и отличаются от методов begin и end. Конструкции and, or, not имеют более низкий приоритет по сравнению с операторами , , , что влияет на порядок… Набор функций, которые включены в стандартную библиотеку языка. Типизация, набор правил определения типа данных значений языка. В идиоматическом Ruby конструкция for почти не используется — предпочтение отдаётся each. Исторический контекст — как возникли Ruby-фреймворки, какие проблемы они решали и как развивалась экосистема. Ruby — язык, построенный на принципах человекоцентричности и выразительности, но при этом обладающий строгой архитектурой для работы с данными. Эффективное использование Ruby в задачах хранения,…Основы языка Ruby
Что требуется знать перед началом изучения языка программирования Ruby
Рекомендации по разработке на Ruby
Объектно-ориентированное программирование в Ruby
История языка Ruby
Синтаксис и пунктуация в Ruby
Ключевые слова языка Ruby
Встроенные функции и методы Ruby
Типы данных в Ruby
Управляющие конструкции и циклы в Ruby
Фреймворки и экосистема Ruby
Работа с базами данных из Ruby